package com.danceforyou.common.util.easyuiTree;

import java.util.ArrayList;
import java.util.List;

import com.danceforyou.common.util.StringUtil;

public class SimpleTree extends EasyuiTree {
	
	protected static final long serialVersionUID = -4924692813938487842L;
	public static final String STATE_OPEN = "open";
	public static final String STATE_CLOSED = "closed";

	/**
	 * 以下是 easyui 树的节点属性：
	 * id：节点ID，对加载远程数据很重要。 text：显示节点文本。 state：节点状态，'open' 或
	 * 'closed'，默认：'open'。如果为'closed'的时候，将不自动展开该节点。 checked：表示该节点是否被选中。
	 * attributes: 被添加到节点的自定义属性。 children: 一个节点数组声明了若干节点。
	 */

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public void setState(String state) {
		this.state = state;
	}

	public String getState() {
		return state;
	}
	
	public boolean getChecked() {
		return checked;
	}

	public void setChecked(boolean checked) {
		this.checked = checked;
	}

	public Object getAttributes() {
		return attributes;
	}

	public void setAttributes(Object attributes) {
		this.attributes = attributes;
	}

	public List<EasyuiTree> getChildren() {
		return children;
	}

	public void setChildren(List<EasyuiTree> children) {
		this.children = children;
	}

	public SimpleTree() {
		
	}

	public SimpleTree(String s, boolean c) {
		this.state = s;
		this.checked = c;
	}
	
	public SimpleTree(String selfId, String showText, String stateOpen, boolean b) {
		this.id = selfId;
		this.text = showText;
		this.state = stateOpen;
		this.checked = b;
	}
	
	/**
	 * 返回一个默认根节点为0的树
	 * 
	 * @param 
	 * @return
	 */
	public  static SimpleTree getEasyTree() {
		return new SimpleTree("0", "全部", SimpleTree.STATE_OPEN, false);
	}

	/**
	 * 返回一个根节点为指定 节点的树
	 * 
	 * @param rootId
	 * @return
	 */
	public static SimpleTree getEasyTree(String rootId) {
		return new SimpleTree(rootId, "", SimpleTree.STATE_OPEN, false);
	}

	@Override
	public EasyuiTree parseList2Tree(List<TreeTemplate> list) {
		SimpleTree root = this; // 定义一个 根节点

		for (TreeTemplate tt : list) {
			if (!StringUtil.isBlank(root.getId())) { // 指定了根节点
				if (root.getId().equals(tt.getSelfId())) {
					root.setText(tt.getShowText());
					root.addAttributes(tt);
					break;
				}
			} else if ("0".equals(tt.getParentId())) {
				root.addAttributes(tt);
				break;
			} else {
//				throw new RuntimeException("生成树失败，没有根节点！");
			}
		}
		
		// 为根节点添加 子节点
		root.addChildren(list);
		return root;
	}

	@Override
	public void addChildren(List<TreeTemplate> list) {
		SimpleTree et = null;
		List<EasyuiTree> ets = new ArrayList<EasyuiTree>();
		for (TreeTemplate tt : list) {
			if (this.getId().equals(tt.getParentId())) {
				et = new SimpleTree(this.getState(), this.getChecked());
				et.addAttributes(tt);
				et.addChildren(list);
				ets.add(et);
			}
		}
		this.setChildren(ets);
	}

	/**
	 * 转换 对象的id和text为 easyui树的id和text
	 * 
	 * @param tt
	 */
	protected void addAttributes(TreeTemplate tt) {
		this.setId(tt.getSelfId());
		this.setText(tt.getShowText());
		this.setAttributes(tt);
	}

	public static List<EasyuiTree> toMultipleRootTree(List<TreeTemplate> multiRootList, List<TreeTemplate> target) {
		List<EasyuiTree> tree = new ArrayList<EasyuiTree>();
		for(TreeTemplate tt :multiRootList){
			SimpleTree et = new SimpleTree(tt.getSelfId(), tt.getShowText(), SimpleTree.STATE_OPEN, false);
			et.setAttributes(tt);
			tree.add(et.parseMultiple2Tree(target));
		}
		return tree;
	}
	
	protected EasyuiTree parseMultiple2Tree(List<TreeTemplate> list) {
		SimpleTree root = this; // 定义一个 根节点

		// TODO 提供节点排序，提高查询效率
	
		for (TreeTemplate tt : list) {
			if (!StringUtil.isBlank(root.getId())) { // 指定了根节点
				if (root.getId().equals(tt.getSelfId())) {
					root.addAttributes(tt);
					break;
				}
			} else {
				if ("0".equals(tt.getParentId())) { // 使用默认的 根节点，根节点id 为 0
					root.addAttributes(tt);
					break;
				} else {
					throw new RuntimeException("生成树失败，没有根节点！");
				}
			}
		}
		
		// 为根节点添加 子节点
		root.addChildren(list);
		return root;
	}
}
